/*
 * Copyright (c) 2021. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
 * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
 * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
 * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
 * Vestibulum commodo. Ut rhoncus gravida arcu.
 */

/**
 * 显示万年历
 * 完成类似Linux的cal命令
 */
public class HomeWork0312506 {
    private String a;

    public static void main(String[] args) {

        //测试闰年方法
//        for (int i=0;i<405;i++){
//            System.out.println(i+":"+isLeepYear(i));
//        }

        //测试某年1月一号距离1900年1月1号有多少天
//        System.out.println(calcDateNum(1901));
//        System.out.println(calcDateNum(1902));
//        System.out.println(calcDateNum(2021));

        //测试今天是本年度的第几天
//        System.out.println(getYearDateNum(2021,1,1));//1
//        System.out.println(getYearDateNum(2021,1,15));//15
//        System.out.println(getYearDateNum(2021,1,31));//31
//        System.out.println(getYearDateNum(2021,2,1));//32
//        System.out.println(getYearDateNum(2021,2,15));//46
//        System.out.println(getYearDateNum(2021,3,1));//31+28+1=60
//        System.out.println(getYearDateNum(2021,12,31));//365
//        System.out.println(getYearDateNum(2021,13,31));//错误的月份

        //测试获取某年某月某日是星期几0-6
//        for(int i=1;i<9;i++){
//            System.out.println("2021-3-"+i+":"+getDay(2021,3,i));
//        }
//        for(int i=1;i<9;i++){
//            System.out.println("1999-12-"+i+":"+getDay(1999,12,i));
//        }

//        printCal(31,0);
//        printCal(30,1);
//        printCal(29,6);
//        for (int i = 1; i <= 12; i++) {
//            System.out.println();
//            System.out.println("\t\t2021年"+i+"月");
//            printCal(getMonthDateNum(2021,i),getDay(2021,i,1));
//        }
        int year = 2021;
        int month = 3;
        try{
            year = Integer.valueOf(args[0]);
        }catch (Exception e){}
        try{
            month = Integer.valueOf(args[1]);
        }catch (Exception e){}
        System.out.println();
        System.out.println("\t\t"+year+"年"+month+"月");
        printCal(getMonthDateNum(2021,month),getDay(2021,month,1));

    }

    /**
     * 判断是否是闰年
     *
     * @param year 被判断的年份
     * @return 是否是闰年
     */
    public static boolean isLeepYear(int year) {
        return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    }

    /**
     * 某年1月一号距离1900年1月1号有多少天
     *
     * @param year 要计算的年份
     * @return 相差的天数
     */
    public static int calcDateNum(int year) {
        int sum = 0;
        for (int i = 1900; i < year; i++) {
            sum += isLeepYear(i) ? 366 : 365;
        }
        return sum;
    }

    /**
     * 今天是本年度的第几天
     *
     * @param year  年
     * @param month 月
     * @param date  日
     * @return 本年度的第几天
     */
    public static int getYearDateNum(int year, int month, int date) {
        int sum = 0;
        //计算已经过去的月份的天数
        switch (month - 1) {
            case 11:
                sum += 30;
            case 10:
                sum += 31;
            case 9:
                sum += 30;
            case 8:
                sum += 31;
            case 7:
                sum += 31;
            case 6:
                sum += 30;
            case 5:
                sum += 31;
            case 4:
                sum += 30;
            case 3:
                sum += 31;
            case 2:
                sum += isLeepYear(year) ? 29 : 28;
            case 1:
                sum += 31;
            case 0:
                break;
            default:
                throw new RuntimeException("月份不对");
        }
        //+当前月的天数
        sum += date;
        return sum;
    }

    /**
     * 某年某月某日距离1900-1-1的天数
     *
     * @param year  年
     * @param month 月
     * @param date  日
     * @return 距离1900-1-的天数
     */
    public static int getDateNum(int year, int month, int date) {
        return calcDateNum(year) + getYearDateNum(year, month, date) - 1;
    }

    /**
     * 获取某年某月某日是星期几0-6
     *
     * @param year  年
     * @param month 月
     * @param date  日
     * @return 星期几 0-6
     */
    public static int getDay(int year, int month, int date) {
        return (getDateNum(year, month, date) + 1) % 7;
    }

    /**
     * 获取月份的天数
     *
     * @param year  年
     * @param month 月
     * @return 天数
     */
    public static int getMonthDateNum(int year, int month) {
        if (month == 4 || month == 6 || month == 9 || month == 11) {
            return 30;
        } else if (month == 2) {
            return isLeepYear(year) ? 29 : 28;
        } else {
            return 31;
        }
    }


    public static void printCal(int maxDate, int week) {
        System.out.println("日\t一\t二\t三\t四\t五\t六");
        for (int i = 0; i < week; i++) {
            System.out.print("\t");
        }
        for (int i = 1, count = week; i <= maxDate; i++, count++) {
            System.out.print(i + "\t");
            if (count % 7 == 6) {
                System.out.println();
            }
        }
        System.out.println();
    }
}

